Welcome to pandas!

7.11 数据透视表的聚合处理

Excel中有透视表工具,在Pandas中同样也提供了一个电子表格样式的数据透视表函数,pivot_table()函数的功能也有强大的数据汇总能力,该函数有pd.pivot_table()和df.pivot_table()两种形式,区别在于pd.pivot_table()函数需要在函数中提供data参数,也就是数据源,而df.pivot_table()函数中的df已提供了数据源,所以不数提供,结构如下:

pd.pivot_table(data,values=None,index=None,columns=None,aggfunc=”mean”,fill_value=None,margins=False,drona=True,margins=”All”,observed=False)

data:提供数据源

values:提供要汇总的列名,如果是多列名,则写在列表中;

index:在数据透视表行索引上进行分组的列名,如果是多个列名则写在列表中,如果传递数组,则其长度必须与data参数提供的表格数据长度相同,该列表可以包含任何其他类型(列表除外)

columns:在数据透视表索引上进行分组的列名,该参数特性与index相同

aggfunc:提供做聚合的方式,可以是函数、列表、字典,默认为numpy.mean(平均)

fill_value:替换缺失值的值(数据透视表缺失值的处理)

margins:添加所有行/列,例如,小计/总计

dropna:将所有条目为NaN的列删除


import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.11 数据透视表的聚合处理.xlsx" )

print (df)

t=df.pivot_table(

values=[ "语文","数学" ],

index=[ "班级","贯籍" ],

aggfunc=[ "sum","mean" ]

)

print (t)

返回:

班级 贯籍 姓名 语文 数学
0 1班 广东 张三 90 83
1 1班 广东 李四 100 87
2 1班 广东 王五 95 88
3 2班 湖南 郭流子 81 97
4 1班 湖南 许麻子 92 89
5 2班 湖南 宋狗子 89 88
6 2班 广东 小曾 84 84
7 2班 广东 韦大宝 87 94

sum mean
数学 语文 数学 语文
班级 贯籍
1班 广东 258 285 86.0 95.0
湖南 89 92 89.0 92.0
2班 广东 178 171 89.0 85.5
湖南 185 170 92.5 85.0

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.11 数据透视表的聚合处理1.xlsx" )

print (df)

t=df.pivot_table(

values= "收入" ,

columns=df.财务日期.dt.month,

index= "产品大类" ,

aggfunc= "sum" ,

fill_value= "0"

)

print (t)

返回:

物料编号 数量 财务日期 收入 产品大类 细分市场
0 1-1364844-8 2000 2024-01-08 412.00 电子连接器 数据通信
1 1-1364844-8 4000 2024-01-08 824.00 电子连接器 数据通信
2 1202-642-P9-2 60 2024-01-08 844.80 电子连接器 医疗&其他
... ... ... ... ... ... ...
9289 1364843-6 2800 2024-02-29 616.00 电子连接器 数据通信
9290 80-0012-6784-0 1000 2024-02-21 12373.18 M线缆 工业控制
9291 80-0013-8735-8 72000 2024-02-27 18927.43 M连接器 工业控制

[9292 rows x 6 columns]


财务日期 1 2
产品大类
M线缆 1156561.33 189673.57
M连接器 557808.14 496924.54
半成品 147123.37 138743.04
原材料 24793.28 0
电子连接器 19194487.02 15702944.41
连接组件 83027.32 112958.34

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.11 数据透视表的聚合处理1.xlsx")

print (df)

t=df.pivot_table(

values= "收入" ,

# columns=df.财务日期.dt.month, # 经过处理的日期是不可能的

columns= "细分市场" ,

index= "产品大类" ,

aggfunc= "sum" ,

fill_value= "0" ,

margins =True,

margins_name= "总计"

)

print (t)

返回:

细分市场 医疗&其他 工业控制 数据通信 新能源 总计
产品大类
M线缆 482636.69 662334.05 201264.16 0 1346234.9
M连接器 0 675783.0 378949.68 0 1054732.68
半成品 4035.41 89025.64 1190.0 191615.36 285866.41
原材料 23689.27 1104.01 0 0 24793.28
电子连接器 2713767.1 4037807.44 26403422.87 1742434.02 34897431.43
连接组件 10485.6 111142.91 74357.15 0 195985.66
总计 3234614.07 5577197.05 27059183.86 1934049.38 37805044.36